<!DOCTYPE html>
<html lang="en">
    <head>
            <meta charset="utf-8">
            <meta http-equiv="X-UA-Compatible" content="IE=edge">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <meta content="Bmob,BmobCloud,bomb,BaaS,mBaaS,PaaS,Serverless,FaaS,Function as a Service,Backend as a Service,serverless computing,cloud function,后端云,bmob后端云,小程序云,小程序后端,云数据库,云存储,文件存储,云函数,云端代码,定时任务,游戏后端,游戏云,用户系统,无服务器函数,移动开发,app开发,小程序开发,云端一体化,互联网中间件" name="keywords"/>
            <meta content="国内首家专注于移动应用Serverless云服务的平台,Bmob后端云让移动开发更简单,全方位一体化的后端服务平台" name="description"/>
            
            
            
            <link rel="shortcut icon" href="../../img/favicon.ico">
        
        <script type="text/javascript" src="//game.bmob.cn/static/doc_union.js"></script>
            <!--
            <title>BQL - Bmob文档中心</title>
            -->
            <title>BQL – Bmob后端云 </title>        
            
            <link href="../../css/bootstrap-custom.min.css" rel="stylesheet">
            <link href="../../css/font-awesome-4.5.0.css" rel="stylesheet">
            <link href="../../css/base.css" rel="stylesheet">
            <link rel="stylesheet" href="../../css/highlight.css">
            <link href="../../css/agate.css" rel="stylesheet">
            <link href="../../css/custom.css" rel="stylesheet" id="custom">
    </head>

    <body >

        <div class="navbar navbar-fixed-top" role="navigation">
    <div class="main-nav">
        <!-- Collapsed navigation -->
        <div class="navbar-header">
            <a class="navbar-brand" href="../..">
                <!--Bmob文档中心-->
                <img src="../../img/logo.png" alt="">
            </a>
        </div>

        <!-- Expanded navigation -->
        <div class="navbar-collapse collapse">

          <ul class="nav navbar-nav">
            
              <li class="pull-left">
                
					<a href="../..">文档首页</a>
                
              </li>
            
              <li class="pull-left">
                
					<!--<a href="">数据服务</a>-->
					<li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">数据服务 <b class="caret"></b></a>
                        <ul class="dropdown-menu">
                            
								<li >
									<a href="../../data/android/">Android</a>
                                </li>
                            
                            
								<li >
									<a href="../../data/ios/">iOS</a>
                                </li>
                            
                            
								<li >
									<a href="../../data/csharp/">C#</a>
                                </li>
                            
                            
								<li >
									<a href="../../data/php/">PHP</a>
                                </li>
                            
                            
								<li >
									<a href="../../data/go/">GO</a>
                                </li>
                            
                            
								<li >
									<a href="../../data/restful/">REST API</a>
                                </li>
                            
                            
								<li >
									<a href="../../data/wechat_app_new/rm/">JavaScript</a>
                                </li>
                            
                            
                                <li >
                                    <a href="../../data/cocos2d_x/">Cocos2D-X</a>
                                </li>
							
                            
								<li >
									<a href="../../data/wechat_app/">小程序</a>
                                </li>
                            
                            
                                <li >
                                    <a href="../../data/wechat_app_new/">快应用</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../data/wechat_app_new/">Nodejs</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../data/wechat_app_new/">Cocos Creator</a>
                                </li>
							
                            
								<li >
									<a href="../../data/wechat_app_new/rm/">小程序(新)</a>
                                </li>
                            
                            
                                <li >
                                    <a href="../../data/kotlin/">Kotlin</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../data/python/">Python</a>
                                </li>
							
                        </ul>
                    </li>
                
              </li>
            
              <li class="pull-left">
                
					<!--<a href="../../cloud_function/android/">云函数</a>-->
					<li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">云函数 <b class="caret"></b></a>
                        <ul class="dropdown-menu">
                            
                                <li >
                                    <a href="../../cloud_function/android/">Android</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../cloud_function/ios/">iOS</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../cloud_function/java/">Java</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../cloud_function/python/">Python</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../cloud_function/csharp/">C#</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../cloud_function/php/">PHP</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../cloud_function/javascript/">JavaScript</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../cloud_function/restful/">REST API</a>
                                </li>
							
                            
								<li >
									<a href="../../cloud_function/web/">Web</a>
                                </li>
                            
                        </ul>
                    </li>
                
              </li>
            
              <li class="pull-left">
                
					<!--<a href="../../sms/android/">短信服务</a>-->
					<li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">短信服务 <b class="caret"></b></a>
                        <ul class="dropdown-menu">
                            
                                <li >
                                    <a href="../../sms/android/">Android</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../sms/ios/">iOS</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../sms/php/">PHP</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../sms/javascript/">JavaScript</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../sms/restful/">REST API</a>
                                </li>
							
                        </ul>
                    </li>
                
              </li>
            
              <li class="pull-left">
                
					<!--<a href="">游戏实时后端</a>-->
					<li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">游戏实时后端 <b class="caret"></b></a>
                        <ul class="dropdown-menu">
                            
								<li >
									<a href="../../game/unity/quick_start/">Unity</a>
                                </li>
                            
                            
								<li >
									<a href="../../game/cocos_creator/quick_start/">Cocos Creator</a>
                                </li>
                            
                            
								<li >
									<a href="../../game/wechat_games/quick_start/">微信小游戏</a>
                                </li>
                            
                            
                                <li >
                                    <a href="../../game/cloud_function/develop_doc/">云函数</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../game/classic_case/">经典案例</a>
                                </li>
							
                        </ul>
                    </li>
                
              </li>
            
              <li class="pull-left">
                
					<!--<a href="">即时通讯</a>-->
					<li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">即时通讯 <b class="caret"></b></a>
                        <ul class="dropdown-menu">
                            
								<li >
									<a href="../../im/android/">Android</a>
                                </li>
                            
                            
								<li >
									<a href="../../im/ios/">iOS</a>
                                </li>
                            
                        </ul>
                    </li>
                
              </li>
            
              <li class="pull-left">
                
					<!--<a href="../../push/android/">推送服务</a>-->
					<li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">推送服务 <b class="caret"></b></a>
                        <ul class="dropdown-menu">
                            
                                <li >
                                    <a href="../../push/android/">Android</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../push/ios/">iOS</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../push/php/">PHP</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../push/javascript/">JavaScript</a>
                                </li>
							
                            
                                <li >
                                    <a href="../../push/restful/">REST API</a>
                                </li>
							
                        </ul>
                    </li>
                
              </li>
            
              <li class="pull-left active">
                
					<!--<a href="../common_problem/">其他</a>-->
					<li class="dropdown active">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">其他 <b class="caret"></b></a>
                        <ul class="dropdown-menu">
                            
                                <li >
                                    <a href="../common_problem/">常见问题</a>
                                </li>
							
                            
                                <li >
                                    <a href="../error_code/">错误码</a>
                                </li>
							
                            
                                <li >
                                    <a href="../data_safety/">数据安全</a>
                                </li>
							
                            
                                <li class="active">
                                    <a href="./">BQL</a>
                                </li>
							
                        </ul>
                    </li>
                
              </li>
            
              <li>
                  <a href="https://www.bmob.cn/repository/index" target="_blank">知识库</a>
              </li>
              <li>
                  <a href="http://doc.bmob.cn/video/index.html" target="_blank">视频教程</a>
              </li>
            </ul>
            
        </div>
    </div>
</div>

        <div class="pagebody" id="main-wrapper">
            <div class="sidebar">
                <div class="bs-sidebar hidden-print affix well" role="complementary">

	
		
	
		
				
				
				
				
				
				
				
				
				
				
				
				
				
				
				
		
	
		
				
				
				
				
				
				
				
				
				
		
	
		
				
				
				
				
				
		
	
		
				
				
				
				
				
		
	
		
				
				
		
	
		
				
				
				
				
				
		
	
		
				
				
				
				
					<div class="code-title">BQL</div>
				
		
	


	<ul class="nav bs-sidenav">
		
			
		
			
		
			
		
			
		
			
		
			
		
			
		
			
				
					
						
					
						
					
						
					
						
							
								
									
										<li class="active "><a href="#_1">介绍及基本语法</a>
											
										</li>
									
										<li class=""><a href="#_2">查询条件</a>
											
											<ul class="nav nav-l2">
												<li><a class="itm-l2" href="#_3">比较查询</a></li>
											</ul>
											
											<ul class="nav nav-l2">
												<li><a class="itm-l2" href="#_4">模糊查询</a></li>
											</ul>
											
											<ul class="nav nav-l2">
												<li><a class="itm-l2" href="#_5">值是否存在查询</a></li>
											</ul>
											
											<ul class="nav nav-l2">
												<li><a class="itm-l2" href="#_6">数组查询</a></li>
											</ul>
											
											<ul class="nav nav-l2">
												<li><a class="itm-l2" href="#_7">地理位置查询</a></li>
											</ul>
											
											<ul class="nav nav-l2">
												<li><a class="itm-l2" href="#_11">查询个数</a></li>
											</ul>
											
											<ul class="nav nav-l2">
												<li><a class="itm-l2" href="#_12">关系查询</a></li>
											</ul>
											
											<ul class="nav nav-l2">
												<li><a class="itm-l2" href="#_13">复合查询</a></li>
											</ul>
											
										</li>
									
										<li class=""><a href="#_14">占位符</a>
											
											<ul class="nav nav-l2">
												<li><a class="itm-l2" href="#_15">普通查询</a></li>
											</ul>
											
											<ul class="nav nav-l2">
												<li><a class="itm-l2" href="#_16">内置函数</a></li>
											</ul>
											
										</li>
									
										<li class=""><a href="#_17">限定返回值</a>
											
										</li>
									
										<li class=""><a href="#_18">排序</a>
											
										</li>
									
										<li class=""><a href="#_19">统计查询</a>
											
											<ul class="nav nav-l2">
												<li><a class="itm-l2" href="#_20">计算总和</a></li>
											</ul>
											
											<ul class="nav nav-l2">
												<li><a class="itm-l2" href="#_21">分组计算总和</a></li>
											</ul>
											
											<ul class="nav nav-l2">
												<li><a class="itm-l2" href="#_22">添加过滤条件</a></li>
											</ul>
											
											<ul class="nav nav-l2">
												<li><a class="itm-l2" href="#_23">统计分组记录数</a></li>
											</ul>
											
										</li>
									
										<li class=""><a href="#_24">内置函数介绍</a>
											
											<ul class="nav nav-l2">
												<li><a class="itm-l2" href="#bql">基本BQL查询用到的内置函数</a></li>
											</ul>
											
											<ul class="nav nav-l2">
												<li><a class="itm-l2" href="#_25">占位符查询用到的内置函数</a></li>
											</ul>
											
										</li>
									
										<li class=""><a href="#_26">性能和建议</a>
											
										</li>
									
								
							
						
					
				
			
		
	</ul>
</div>
            </div>
            <div class="content" role="main">
                <div class="wrap">
                    

<p>Bmob Query Language（简称 BQL） 是 Bmob 为查询 API 定制的一套类似 SQL 查询语法的子集和变种，主要目的是降低大家学习 Bmob 查询的 API 的成本，可以使用传统的 SQL 语法来查询 Bmob 应用内的数据。</p>
<p>本文档将详细介绍 BQL 的语法和常见用法。</p>
<h2 id="_1">介绍及基本语法<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h2>
<p>最基本的一个查询:</p>
<p>查询某个 class 下的 100 条数据：</p>
<pre><code class="sql">select * from GameScore
</code></pre>

<p>等价于（以 Android 为例）:</p>
<pre><code class="sql">//查询GameScore的100条数据
BmobQuery&lt;GameScore&gt; query = new BmobQuery&lt;GameScore&gt;();
query.findObjects(context, new FindListener&lt;GameScore&gt;() {

    @Override
    public void onSuccess(List&lt;GameScore&gt; object) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onError(int code, String msg) {
        // TODO Auto-generated method stub
    }
});
</code></pre>

<p>select一个完整的语法形式类似这样：</p>
<pre><code class="sql">select [查询字段列表，多个以逗号隔开] from [class 名称]
   [where [条件列表]
   [limit skip,limit
   [order by [排序字段列表] [asc |desc]]]]
</code></pre>

<p>举例：</p>
<pre><code class="sql">
//查询结果只包含 name,playScore 以及内置字段(objectId,createdAt等)
select name,playScore from GameScore

//根据 name 查找
select * from GameScore where name='smile'

//根据 name 和 playScore 同时查找
select * from GameScore where name is exists and playScore &gt; 80 and playScore &lt;= 100

//分页查找，从第 10 条开始向后查找 10 条数据
select * from GameScore limit 10,10

//根据 score 和 name 排序
select * from GameScore order by -playScore,+name

</code></pre>

<p><code>注：当查询的表为系统表（目前系统表有User、Installation、Role）时，需要带上下划线</code>_<code>。</code></p>
<p>比如，你想查询的是用户<code>smile</code>的信息，则：</p>
<pre><code class="sql">
`select * from _User where username= smile`

</code></pre>

<h2 id="_2">查询条件<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h2>
<h3 id="_3">比较查询<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3>
<p>查询指定信息的对象，用 <code>=</code> 比较符：</p>
<pre><code class="sql">select * from GameScore where name='smile'
</code></pre>

<p>查询<code>不等于</code>指定信息的对象，用<code>!=</code>比较符：</p>
<pre><code class="sql">select * from GameScore where name!='smile'
</code></pre>

<p>也可以用<code>&lt;&gt;</code>运算符来表示不等于。</p>
<p>比较日期，使用<code>date</code>函数来转换，比如查询特定时间之前创建的对象：</p>
<pre><code class="sql">select * from GameScore where createdAt &lt; date('2015-05-20 00:00:00')

</code></pre>

<p>date 函数接收的日期格式必须是 <code>yyyy-MM-dd HH:mm:ss</code>。更多内置函数请看最后的 <a href="../../bql/index.html?menukey=otherdoc&amp;key=bql#内置函数">内置函数</a>。</p>
<p>一些常见的查询运算符：</p>
<table>
<thead>
<tr>
<th align="center">Key</th>
<th align="center">Operation</th>
<th align="center">对应Bmob的查询API</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">=</td>
<td align="center">等于</td>
<td align="center">addWhereEqualTo</td>
</tr>
<tr>
<td align="center">!= 或者 &lt;&gt;</td>
<td align="center">不等于</td>
<td align="center">addWhereNotEqualTo</td>
</tr>
<tr>
<td align="center">&lt;</td>
<td align="center">小于</td>
<td align="center">addWhereLessThan</td>
</tr>
<tr>
<td align="center">&lt;=</td>
<td align="center">小于等于</td>
<td align="center">addWhereLessThanOrEqualTo</td>
</tr>
<tr>
<td align="center">&gt;</td>
<td align="center">大于</td>
<td align="center">addWhereGreaterThan</td>
</tr>
<tr>
<td align="center">&gt;=</td>
<td align="center">大于等于</td>
<td align="center">addWhereGreaterThanOrEqualTo</td>
</tr>
<tr>
<td align="center">[not] like</td>
<td align="center">模糊查询</td>
<td align="center">addWhereStartsWith或addWhereEndsWith</td>
</tr>
<tr>
<td align="center">[not] regexp</td>
<td align="center">正则匹配</td>
<td align="center">addWhereMatches</td>
</tr>
<tr>
<td align="center">[not] in(子查询或者数组)</td>
<td align="center">包含或者不包含</td>
<td align="center">addWhereMatchesQuery或者addWhereDoesNotMatchQuery</td>
</tr>
<tr>
<td align="center">is [not] exists</td>
<td align="center">这个Key有值或者不存在值</td>
<td align="center">addWhereExists或addWhereDoesNotExists</td>
</tr>
</tbody>
</table>
<p>注：比较运算符可以用在<code>日期</code>、<code>字符串</code>、<code>数字</code>甚至<code>对象</code>上。</p>
<h3 id="_4">模糊查询<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h3>
<p><strong>注:模糊查询只对付费用户开放，付费后可直接使用。</strong></p>
<p>模糊查询可以使用 <code>like</code>，比如查询名字以 smile 开头的对象</p>
<pre><code class="sql">select * from GameScore where name like 'smile%'
</code></pre>

<p>% 表示模糊匹配的位置占位符。</p>
<p><code>like</code> 本质上是转成<code>regexp</code>的正则匹配查询，因此上面的例子还可以写成：</p>
<pre><code class="sql">select * from GameScore where name regexp 'smile.*'
</code></pre>

<p>否定形式，以<code>not like</code> 来查询名字不以 smile 开头的对象：</p>
<pre><code class="sql">select * from GameScore where name not like 'smile%'
</code></pre>

<p>等价于<code>not regexp</code>:</p>
<pre><code class="sql">select * from GameScore where name not regexp 'smile.*'
</code></pre>

<h3 id="_5">值是否存在查询<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h3>
<p>只返回 name 字段值存在的对象：</p>
<pre><code class="sql">select * from GameScore where name is exists
</code></pre>

<p>反之，使用 <code>is not exists</code>。</p>
<h3 id="_6">数组查询<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h3>
<p>假设<code>hobby</code>表示一个人的爱好，其字段类型是List<String>对应服务端的<code>数组Array</code>类型，如我们想查询有游泳爱好的人：</p>
<pre><code class="sql">select * from Person where hobby ='游泳'&quot;
</code></pre>

<p>查询既爱好游泳也爱好看书的人：</p>
<pre><code class="sql">select * from Person where hobby all ('游泳','看书')
</code></pre>

<p><strong>注：all 表示数组完全匹配。</strong></p>
<h3 id="_7">地理位置查询<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h3>
<p>我们可以通过 BQL 进行地理位置查询。</p>
<h4 id="_8">附近的人<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h4>
<p>使用<code>near</code>来查询附近的人</p>
<p>比如我想查询指定地理位置附近的玩家（从近到远排序），假设 <code>gps</code> 字段是 <code>BmobGeoPoint</code>类型：</p>
<pre><code class="sql">select * from GameScore where gps near [112.934755,24.52065]
</code></pre>

<p><strong>注：[112.934755,24.52065] 是经纬度坐标。必须是经度在前，纬度在后</strong></p>
<p>也可以使用 <code>geopoint</code> 函数来创建：</p>
<pre><code class="sql">select * from GameScore where gps near geopoint(112.934755,24.52065)
</code></pre>

<p><strong>注：只有在地理位置信息查询里才可以使用 <code>[longitude, latitude]</code>这样的语法。在其他查询里将被作为数组类型。</strong></p>
<h4 id="_9">限定搜索范围<a class="headerlink" href="#_9" title="Permanent link">&para;</a></h4>
<p>为了限定搜索的最大距离，还可以使用 <code>max distance 单位</code>来限定，比如,搜索附近1公里内的人：</p>
<pre><code class="java">select * from GameScore where gps near [112.934755,24.52065] max 1 km

</code></pre>

<p><strong>注：单位包括 miles（英里）、radians（弧度），默认是弧度。</strong></p>
<h4 id="_10">查询矩形范围<a class="headerlink" href="#_10" title="Permanent link">&para;</a></h4>
<p>如果想查询某个矩形框内的对象，可以使用<code>within [西南坐标] and [东北坐标]</code>的语法：</p>
<pre><code class="sql">select * from GameScore where gps within [102.934755,24.52065] and [112.934755,24.52065]
</code></pre>

<h3 id="_11">查询个数<a class="headerlink" href="#_11" title="Permanent link">&para;</a></h3>
<p>使用 <code>count</code> 查询来返回符合查询条件的数目。</p>
<p>比如:查询整张表的记录数：</p>
<pre><code class="sql">select count(*) from GameScore
</code></pre>

<p><strong>注：count 不支持distinct等语法。仅限count(*)和count(objectId)</strong></p>
<p>查询总的记录数并返回得分在10-20之间的游戏分数信息</p>
<pre><code class="sql">select count(*) from GameScore where playScore&gt;10 and where playScore&lt;20
</code></pre>

<p>查询个数的同时可以返回对象,使用<code>,</code>隔开：</p>
<pre><code class="sql">select count(*),* from GameScore
</code></pre>

<p>也可以返回特定的字段：</p>
<p>比如：查询GameScore表中的总数并返回每条记录的游戏名</p>
<pre><code class="sql">select count(*),game from GameScore

</code></pre>

<h3 id="_12">关系查询<a class="headerlink" href="#_12" title="Permanent link">&para;</a></h3>
<p>有如下几种方式来查询对象之间的关系数据 </p>
<p>1、如果您想获取对象，而这个对象的一个字段对应了另一个对象, 您可以用一个 <code>where</code> 查询, 自己构造一个 <code>Pointer</code> 函数, 和其他数据类型一样。</p>
<p>例如： <code>Weibo</code>类中有一个<code>User</code>（继承自BmobUser）类型的<code>author</code>字段表示这条微博的发送方，现在你想查询当前用户发布的所有微博信息，那么可以这样写：</p>
<pre><code class="sql">select include author,* from Weibo where author = pointer('_User', '6720c14c28')
</code></pre>

<p><code>pointer</code>内置函数接收 className 和 objectId。</p>
<p>2、如果您想获取对象, 这个对象的一个字段指向的对象（必须是BmobPointer类型）是符合另一个查询的, 您可以使用<code>in</code>查询。</p>
<p>例如, 假设您有一个 <code>Weibo</code> 类和一个 <code>Comment</code> 类, 每个<code>Comment</code> 都有一个指向它的 <code>Weibo</code> 的 weibo字段（BmobPointer类型）, 现在您想查询带有图片的 <code>Weibo</code> 的 Comment列表:</p>
<pre><code class="sql">select * from Comment where weibo in (select * from Weibo where image is exists)
</code></pre>

<p><strong>注:默认的 limit 是 100 而且最大的 limit 是 1000，这个限制同样适用于内部的查询, 所以对于较大的数据集您可能需要细心地构建查询来获得期望的行为。</strong></p>
<p>3、如果 <code>Weibo</code> 类下有一个<code>BmobRelation</code>类型的<code>comment</code>字段，它存储了这条微博所有的评论列表。你可以查询到这些评论信息，因为他们都关联到了同一条微博：</p>
<pre><code class="sql">select * from Comment where related comment to pointer('Weibo', '262f6ace1a')
</code></pre>

<p>基本的查询形式是 <code>releated &lt;key&gt; to &lt;pointer&gt;</code>。</p>
<p>4、如果某个字段是 Pointer ，默认查询的时候，只会返回 {__type: 'Pointer', objectId: 'xxxxxx', className:'Weibo'} 这些基本信息，如果希望同时将这个对象的其他信息查询下来，可以使用<code>include</code>。</p>
<p>1）、采用 <code>include &lt;key&gt;</code> 就可以将某个 <code>Pointer</code>字段关联查询出来：</p>
<p>比如查询 <code>Comment</code> 同时将 <code>author</code>带下来：</p>
<pre><code class="sql">select include author, * from Comment
</code></pre>

<p>2）、<code>多个字段要多次 include</code>:</p>
<pre><code class="sql">select include weibo,include author from Comment
</code></pre>

<p>3）、还可以支持<code>嵌套的 include 查询</code>：</p>
<p>比如 <code>Weibo</code> 里还有一个 Pointer 指向 author(表示这条微博是谁发的):</p>
<pre><code class="sql">select include weibo.author,* from Comment
</code></pre>

<h3 id="_13">复合查询<a class="headerlink" href="#_13" title="Permanent link">&para;</a></h3>
<p>使用 <code>and</code> 和 <code>or</code>进行复合查询</p>
<p>比如：查询游戏得分在10-15之间的数据,可以使用<code>and</code>查询:</p>
<pre><code class="sql">select * from GameScore where playScore&gt;10 and playScore&lt;=15
</code></pre>

<p>如果你想再加个条件：再查询分数为0的数据，可以使用<code>or</code>查询：</p>
<pre><code class="sql">select * from GameScore where playScore&gt;10 and playScore&lt;=15 or playScore=5
</code></pre>

<p>由于<code>and</code>的优先级高于<code>or</code>，因此,上面的查询也可以用括号来明确地表示这种优先级：</p>
<pre><code class="sql">select * from GameScore where (playScore&gt;10 and playScore&lt;=15) or playScore=5
</code></pre>

<h2 id="_14">占位符<a class="headerlink" href="#_14" title="Permanent link">&para;</a></h2>
<p>查询条件<code>where</code>和 <code>limit</code> 子句支持占位符，也就是可以用问号 ? 替代值，值的列表通过 SDK 提供的方法传入，具体请参考各 SDK 用法。</p>
<h3 id="_15">普通查询<a class="headerlink" href="#_15" title="Permanent link">&para;</a></h3>
<p>例如：</p>
<pre><code class="sql">select * from GameScore where name=? and playScore&gt;? limit ?,?
</code></pre>

<h3 id="_16">内置函数<a class="headerlink" href="#_16" title="Permanent link">&para;</a></h3>
<p>占位符查询中用到的内置函数，请看最后的 <a href="../../bql/index.html?menukey=otherdoc&amp;key=bql#占位符查询用到的内置函数">占位符查询用到的内置函数</a>。</p>
<p>例如：</p>
<pre><code class="java">
select * from GameScore where createdAt &gt; date(?) and player = pointer(?,?) and gps near geopoint(?,?)

</code></pre>

<p><strong>注意：</strong></p>
<p><strong>和统计查询有关的<code>group by</code>、<code>order by</code>、<code>having</code>等字句是不支持占位符的。</strong></p>
<p><code>正确</code>写法：</p>
<pre><code class="java">select sum(playScore),count(*) from GameScore group by game having _sumPlayScore&gt;200
</code></pre>

<p><code>错误</code>写法：</p>
<pre><code class="java">select sum(playScore),count(*) from GameScore group by ? having ?
</code></pre>

<p><strong>注：我们推荐使用占位符的方式来使用 BQL，查询语句可以通过预编译得到缓存，降低 BQL 的转换开销。</strong></p>
<h2 id="_17">限定返回值<a class="headerlink" href="#_17" title="Permanent link">&para;</a></h2>
<p>通过 <code>limit</code> 语句来限定返回结果大小，比如限定返回 10 个：</p>
<pre><code class="sql">select * from GameScore limit 10
</code></pre>

<p>可以设定从第<code>m+1</code>个元素开始，例如从第 11 个元素（包含）开始往后取 10 个：</p>
<pre><code class="sql">select * from GameScore limit 10,10
</code></pre>

<p><strong>注：如果查询语句没有设定 limit ，默认的 limit 是 100 而且最大的 limit 是 1000。</strong></p>
<h2 id="_18">排序<a class="headerlink" href="#_18" title="Permanent link">&para;</a></h2>
<p>通过 <code>order</code> 语句来排序，<code>order</code> 语句只能出现在最后，不能在 <code>where</code> 和 <code>limit</code> 之前。</p>
<p>比如：按照得分降序排列（得分高的在前）：</p>
<pre><code class="sql">select * from GameScore order by playScore desc
</code></pre>

<p>也可以写成：</p>
<pre><code class="sql">select * from GameScore order by -playScore
</code></pre>

<p><strong>注：加号表示升序，减号表示降序。</strong></p>
<p>多个字段组合排序</p>
<p>比如：得分高的在前（playScore降序），当得分一样的情况下，再按照名称（字母顺序）更小的在前（name升序）：</p>
<pre><code class="sql">select * from GameScore order by -playScore,name
</code></pre>

<p>同样的语句可以写成：</p>
<pre><code class="sql">select * from GameScore order by playScore,+name desc
</code></pre>

<p>或者</p>
<pre><code class="sql">select * from GameScore order by -playScore,name asc
</code></pre>

<p><strong>注：没有写上明确的加号或者减号的字段，将根据最后的 desc 或者 asc 来决定采用升序还是降序。</strong></p>
<h2 id="_19">统计查询<a class="headerlink" href="#_19" title="Permanent link">&para;</a></h2>
<p>统计查询只适用于 <code>Number</code> 类型的列，支持 <code>sum</code> (计算总和), <code>average</code> (计算平均值), <code>max</code> (计算最大值), <code>min</code> (计算最小值)</p>
<p>举几个例子（以sum求和）:</p>
<h3 id="_20">计算总和<a class="headerlink" href="#_20" title="Permanent link">&para;</a></h3>
<p>比如：查询<code>GameScore</code>表所有玩家的得分总和:</p>
<pre><code class="sql">select sum(playScore) from GameScore
</code></pre>

<h3 id="_21">分组计算总和<a class="headerlink" href="#_21" title="Permanent link">&para;</a></h3>
<p>比如：按玩家分组，获取每个玩家的总得分：</p>
<pre><code class="sql">select sum(playScore) from GameScore group by name
</code></pre>

<h3 id="_22">添加过滤条件<a class="headerlink" href="#_22" title="Permanent link">&para;</a></h3>
<p>比如 按玩家分组，获取每个玩家的总得分，并且总得分大于100的：</p>
<pre><code class="sql">select sum(playScore) from GameScore group by name having _sumPlayScore &gt; 100
</code></pre>

<h3 id="_23">统计分组记录数<a class="headerlink" href="#_23" title="Permanent link">&para;</a></h3>
<p>同时支持返回每个组用于计算总和的总数：</p>
<pre><code class="sql">select sum(playScore),count(*) from GameScore group by name having _sumPlayScore &gt; 100
</code></pre>

<p><strong>注：</strong></p>
<p><strong>1、查询语句中含有<code>sum</code>或 <code>group by</code>的时候不支持返回表中的其他列，只返回group by后面接的列名、sum的列名为 <code>(_sum+(首字母大写的列名))</code> 以及有count(*)会返回的 <code>_count</code>等数据。所以只应该用于统计的功能时候使用。</strong></p>
<p><strong>2、其他关键字和sum的使用类似，只需要以上的<code>sum</code>换为<code>average</code>,<code>max</code>, <code>min</code>，其中<code>average</code>返回的平均值列名为：<code>(_avg+(首字母大写的列名))</code>。</strong></p>
<h2 id="_24">内置函数介绍<a class="headerlink" href="#_24" title="Permanent link">&para;</a></h2>
<p>BQL提供了一些<code>内置函数</code>来方便地创建 <code>pointer</code>、<code>geopoint</code>、<code>date</code>、<code>file</code>等类型：</p>
<h3 id="bql">基本BQL查询用到的内置函数<a class="headerlink" href="#bql" title="Permanent link">&para;</a></h3>
<table>
<thead>
<tr>
<th align="center">Key</th>
<th align="center">Operation</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">date('yyyy-MM-dd HH:mm:ss')</td>
<td align="center">创建日期类型</td>
</tr>
<tr>
<td align="center">pointer(className,objectId)</td>
<td align="center">创建 Pointer</td>
</tr>
<tr>
<td align="center">geopoint(经度，维度)</td>
<td align="center">创建 GeoPoint</td>
</tr>
<tr>
<td align="center">file(filename,url)</td>
<td align="center">创建 file 类型</td>
</tr>
<tr>
<td align="center">current_timestamp()</td>
<td align="center">创建当前日期</td>
</tr>
</tbody>
</table>
<hr />
<h3 id="_25">占位符查询用到的内置函数<a class="headerlink" href="#_25" title="Permanent link">&para;</a></h3>
<p>如果使用占位符查询，比较特殊，其内置函数的形式如下</p>
<table>
<thead>
<tr>
<th align="center">Key</th>
<th align="center">Operation</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">date(?)</td>
<td align="center">创建日期类型</td>
</tr>
<tr>
<td align="center">pointer(?,?)</td>
<td align="center">创建 Pointer</td>
</tr>
<tr>
<td align="center">geopoint(?,?)</td>
<td align="center">创建 GeoPoint</td>
</tr>
<tr>
<td align="center">file(?,?)</td>
<td align="center">创建 file 类型</td>
</tr>
</tbody>
</table>
<hr />
<p>举例子（以Android为例）：</p>
<p>1、Date类型：</p>
<pre><code class="sql">String dateString = &quot;2015-05-12&quot;;  
SimpleDateFormat sdf = new SimpleDateFormat(&quot;yyyy-MM-dd&quot;);
Date date  = null;
try {
    date = sdf.parse(dateString);
} catch (ParseException e) {
}  
String sql = &quot;select * from GameScore where createdAt &lt; date('&quot;+new BmobDate(date).getDate()+&quot;')&quot;
</code></pre>

<p>等价于：（以下是REST API文档中定义的创建<code>Date类型</code>的JSON对象）</p>
<pre><code class="sql">select * from GameScore where createdAt &lt; {'__type': 'Date','iso': '&quot;+new BmobDate(date).getDate()+&quot;'}
</code></pre>

<p>2、Pointer类型：</p>
<pre><code class="sql">User user = BmobUser.getCurrentUser(this, User.class);
String sql = select * from GameScore where player = pointer('_User', &quot;+&quot;'&quot;+user.getObjectId()+&quot;')

</code></pre>

<p>等价于：（以下是REST API文档中定义的创建<code>Pointer类型</code>的JSON对象）</p>
<pre><code class="sql">select * from GameScore where player = {'__type':'Pointer','className':'_User','objectId':'&quot;+user.getObjectId()+&quot;'}
</code></pre>

<p>3、GeoPoint类型</p>
<pre><code class="sql">select * from GameScore where gps = geopoint(112.934755,24.52065)
</code></pre>

<p>等价于：（以下是REST API文档中定义的创建<code>GeoPoint类型</code>的JSON对象）</p>
<pre><code class="sql">select * from GameScore where gps = {'__type':'GeoPoint','latitude':24.52065,'longitude':112.934755}
</code></pre>

<p><strong>注：</strong></p>
<p><strong>1、如果不使用<code>内置函数</code>，你也使用 <a href="../../Restful/developdoc/index.html?menukey=develop_doc&amp;key=develop_restful#数据类型" title="Rest API文档">Rest API文档</a>定义的 JSON 对象来创建特定类型,不过这样写相对来说比较繁琐。</strong></p>
<p><strong>2、占位符查询中如果要用到内置函数，其形式必须为上述列出的，最后的可变参数会自动替换类型中的<code>?</code>。</strong></p>
<h2 id="_26">性能和建议<a class="headerlink" href="#_26" title="Permanent link">&para;</a></h2>
<p>BQL 最终还是转换成 <a href="../../Restful/developdoc/index.html?menukey=develop_doc&amp;key=develop_restful" title="Rest API文档">Rest API文档</a> 里查询部分提到的各种 where 条件，因为多了一层转换，理论上会比直接使用 where 查询慢一点。并且 BQL 对长度有所限制，要求在 4096 字节以内。</p>
<p>此外，我们推荐查询语句都采用占位符的方式，使用占位符的查询语句将有机会被缓存复用，避免重复解释的开销。</p>
                </div>
            </div>
        </div>

        
            <script>var base_url = '../..';</script>
            <script src="../../js/jquery-1.10.2.min.js"></script>
            <script src="../../js/bootstrap-3.0.3.min.js"></script>
            <script src="../../js/highlight.pack.js"></script>
            <script src="../../js/main.js"></script>
            <script src="../../js/base.js"></script>

        <div id="go-top"><i class="fa fa-chevron-up"></i></div>
        <a href="https://docs.bmob.cn/data/Android/a_faststart/doc/index.html" id="back" target="_blank">返回 <br> 旧版</a>
    </body>

</html>